from flask import request, jsonify
import json
from app.models import Video
from app.extensions import db
from app.utils.redis_utils import redis_utils, RedisKeys, CacheExpiry
from app.utils.redis_util import queue_view_count_update


def get_recommended_videos():
    """
    获取推荐视频列表
    
    Returns:
        JSON响应
    """
    try:
        # 获取分页参数
        page = request.args.get('page', 1, type=int)
        page_size = request.args.get('pageSize', 10, type=int)
        
        # 调用Video模型的get_recommended_videos方法获取推荐视频
        videos, total = Video.get_recommended_videos(db, page, page_size)
        total_pages = (total + page_size - 1) // page_size
        
        # 返回视频列表
        return jsonify({
            'code': 200,
            'message': '获取推荐视频成功' + ('（从缓存）' if hasattr(videos, 'fromCache') and videos.fromCache else ''),
            'data': {
                'list': videos,
                'page': page,
                'pageSize': page_size,
                'total': total,
                'totalPages': total_pages
            }
        })
        
    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'获取推荐视频失败: {str(e)}',
            'data': None
        }), 500


def get_latest_videos():
    """
    获取最新视频列表
    
    Returns:
        JSON响应
    """
    try:
        # 获取分页参数
        page = request.args.get('page', 1, type=int)
        page_size = request.args.get('pageSize', 10, type=int)
        
        # 调用Video模型的get_latest_videos方法获取最新视频
        videos, total = Video.get_latest_videos(db, page, page_size)
        total_pages = (total + page_size - 1) // page_size
        
        # 返回视频列表
        return jsonify({
            'code': 200,
            'message': '获取最新视频成功' + ('（从缓存）' if hasattr(videos, 'fromCache') and videos.fromCache else ''),
            'data': {
                'list': videos,
                'page': page,
                'pageSize': page_size,
                'total': total,
                'totalPages': total_pages
            }
        })
        
    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'获取最新视频失败: {str(e)}',
            'data': None
        }), 500


def get_hot_videos():
    """
    获取热门视频列表
    
    Returns:
        JSON响应
    """
    try:
        # 获取分页参数
        page = request.args.get('page', 1, type=int)
        page_size = request.args.get('pageSize', 10, type=int)
        
        # 调用Video模型的get_hot_videos方法获取热门视频
        videos, total = Video.get_hot_videos(db, page, page_size)
        total_pages = (total + page_size - 1) // page_size
        
        # 返回视频列表
        return jsonify({
            'code': 200,
            'message': '获取热门视频成功' + ('（从缓存）' if hasattr(videos, 'fromCache') and videos.fromCache else ''),
            'data': {
                'list': videos,
                'page': page,
                'pageSize': page_size,
                'total': total,
                'totalPages': total_pages
            }
        })
        
    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'获取热门视频失败: {str(e)}',
            'data': None
        }), 500


def get_slide_videos():
    """
    获取幻灯片视频列表
    
    Returns:
        JSON响应
    """
    try:
        # 调用Video模型的get_slide_videos方法获取幻灯片视频
        videos = Video.get_slide_videos(db, limit=6)
        
        # 返回视频列表，确保格式与其他接口一致
        return jsonify({
            'code': 200,
            'message': '获取幻灯片视频成功',
            'data': {
                'list': videos
            }
        })
        
    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'获取幻灯片视频失败: {str(e)}',
            'data': None
        }), 500


def get_videos_by_category(category_id):
    """
    根据类别获取视频列表
    
    Args:
        category_id: 类别ID
    
    Returns:
        JSON响应
    """
    try:
        # 验证类别ID
        if not category_id or not category_id.isdigit():
            return jsonify({
                'code': 400,
                'message': '无效的类别ID',
                'data': None
            }), 400
        
        # 获取分页参数
        page = request.args.get('page', 1, type=int)
        page_size = request.args.get('pageSize', 10, type=int)
        
        # 调用Video模型的get_videos_by_category方法获取分类视频
        videos, total = Video.get_videos_by_category(db, int(category_id), page, page_size)
        total_pages = (total + page_size - 1) // page_size
        
        # 返回视频列表
        return jsonify({
            'code': 200,
            'message': '获取类别视频成功',
            'data': {
                'list': videos,
                'page': page,
                'pageSize': page_size,
                'total': total,
                'totalPages': total_pages
            }
        })
        
    except Exception as e:
        return jsonify({
            'code': 500,
            'message': f'获取类别视频失败: {str(e)}',
            'data': None
        }), 500


# 注意：路由已在routes.py中定义
def get_video_detail(video_id):
    """
    获取视频详情
    :param video_id: 视频ID
    :return: JSON格式的视频详情数据
    """
    try:
        # 验证video_id是否为有效的数字
        if not video_id or not video_id.isdigit():
            return jsonify({
                'code': 400,
                'message': '无效的视频ID',
                'data': None
            }), 400
        
        # 转换video_id为整数
        video_id_int = int(video_id)
        
        # 直接调用Video模型的get_video_detail方法，该方法包含了缓存逻辑和观看次数更新
        video_data = Video.get_video_detail(db, video_id_int)
        
        if not video_data:
            return jsonify({
                'code': 404,
                'message': '视频不存在或已下架',
                'data': None
            }), 404
        
        # 返回视频详情
        return jsonify({
            'code': 200,
            'message': '获取视频详情成功' + ('（从缓存）' if video_data.get('_fromCache') else ''),
            'data': video_data
        })
        
    except Exception as e:
        print(f"获取视频详情失败: {str(e)}")
        import traceback
        print(traceback.format_exc())
        db.session.rollback()
        return jsonify({
            'code': 500,
            'message': f'获取视频详情失败: {str(e)}',
            'data': None
        }), 500